BUG_ON(old_mfn == new_mfn);
set_gpfn_from_mfn(old_mfn, INVALID_M2P_ENTRY);
+ if (likely(clear_PGC_allocate)) {
+ if (!test_and_clear_bit(_PGC_allocated, &old_page->count_info))
+ BUG();
+ } else {
+ int ret;
+ // adjust for count_info for domain_page_flush_and_put()
+ // This is slow path.
+ BUG_ON(!test_bit(_PGC_allocated, &old_page->count_info));
+ BUG_ON(d == NULL);
+ ret = get_page(old_page, d);
+ BUG_ON(ret == 0);
+ }
domain_page_flush_and_put(d, mpaddr, pte, old_pte, old_page);
- perfc_incrc(assign_domain_pge_cmpxchg_rel);
+ perfc_incr(assign_domain_pge_cmpxchg_rel);
return 0;
}
page = mfn_to_page(mfn);
BUG_ON((page->count_info & PGC_count_mask) == 0);
- // exchange_memory() calls
- // steal_page()
- // page owner is set to NULL
- // guest_physmap_remove_page()
- // zap_domain_page_one()
- domain_put_page(d, mpaddr, pte, old_pte, (page_get_owner(page) != NULL));
+ BUG_ON(clear_PGC_allocate && (page_get_owner(page) == NULL));
+ domain_put_page(d, mpaddr, pte, old_pte, clear_PGC_allocate);
- perfc_incrc(zap_dcomain_page_one);
+ perfc_incr(zap_dcomain_page_one);
}
unsigned long
return -ENOSYS;
}
- zap_domain_page_one(d, gpfn << PAGE_SHIFT, INVALID_MFN);
+ zap_domain_page_one(d, gpfn << PAGE_SHIFT, 1, INVALID_MFN);
- perfc_incrc(dom0vp_zap_physmap);
+ perfc_incr(dom0vp_zap_physmap);
return 0;
}
/* try_to_clear_PGC_allocate(d, page) is not needed. */
BUG_ON(page_get_owner(page) == d &&
get_gpfn_from_mfn(mfn) == gpfn);
+ BUG_ON(pte_pgc_allocated(old_pte));
domain_page_flush_and_put(d, gpaddr, pte, old_pte, page);
- perfc_incrc(destroy_grant_host_mapping);
+ perfc_incr(destroy_grant_host_mapping);
return GNTST_okay;
}
unsigned long mfn)
{
BUG_ON(mfn == 0);//XXX
- zap_domain_page_one(d, gpfn << PAGE_SHIFT, mfn);
+ zap_domain_page_one(d, gpfn << PAGE_SHIFT, 0, mfn);
- perfc_incrc(guest_physmap_remove_page);
+ perfc_incr(guest_physmap_remove_page);
}
static void